package com.qf.config;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.oas.annotations.EnableOpenApi;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import org.springframework.context.annotation.Bean;

@Configuration // 配置类指定当前类是 配置类
@EnableOpenApi //swagger注解
public class SwaggerConfig {
    @Value("${swagger.enabled}")
    private boolean enabled;

    /**
     *
     *  * Swagger3的接口配置
     *  * <p>
     *  * http://localhost:8080/swagger-ui/index.html#/
     *
     * 创建API
     * @Configuration：标记该类为配置类。
     * @Bean：表示 Docket 对象是一个 Spring 管理的 bean。
     * Docket 配置：
     * DocumentationType.SWAGGER_2：指定生成 Swagger 2 类型的文档。
     * apiInfo(apiInfo())：通过 apiInfo() 方法来设置 API 文档的基本信息（如标题、描述、版本等）。
     * select()：选择 API 的扫描配置。
     * apis(RequestHandlerSelectors.basePackage("com.example.controller"))：指定扫描控制器的基础包（例如 com.example.controller）。
     * paths(PathSelectors.any())：表示扫描所有路径（可以进一步细化路径过滤条件）。
     * apiInfo()：构造 API 信息，包含文档的标题、描述和版本等。
     */
    @Bean// 将这个Docket对象放入spring容器中
    public Docket createRestApi() {
        //Docket对象是swagger的核心对象，相当于一个项目，可以配置多个group，每个group就是文档的一个版本
        return new Docket(DocumentationType.OAS_30)
                .enable(enabled)// 是否启用swagger，如果是false，swagger相关接口将不会生效，默认是true
                .apiInfo(apiInfo())// 是构造 API 信息，包含文档的标题、描述和版本等。
                .select()//
                .apis(RequestHandlerSelectors.basePackage("com.qf"))// 指定扫描控制器的基础包（例如 com.example.controller）
                .paths(PathSelectors.any())// 表示扫描所有    路径（可以进一步细化路径过滤条件）
                .build();// 构建 Docket 对象
    }

    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
                .title("api接口文档")// 设置文档的标题
                .description("具体包含了xxx模块")// 设置文档的描述
                .contact(new Contact("wangbo", "http://www.baidu.com", "qf@qq.com"))// 设置联系人信息
                .version("1.0")// 设置文档的版本信息
                .build();
    }


}
